package view;

import controller.PacienteCrudXML;
import controller.tableModels.TableModelPaciente;
import util.Mascaras;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import model.crudxml.Paciente;

public class Pacientes extends JPanel {

    private JPanel areaBotoes;//, areaDados;
    private AreaEdicao areaEdicao;
    private JButton jbSalvar, jbAlterar, jbExcluir, jbPesquisar, jbAnamnese;
    private JTable jtPacientes;
    private JScrollPane jspPacientes;
    private PacienteCrudXML pacienteCrudXML;
    private Paciente pacienteEmEdicao;
    private TableModelPaciente tableModelPaciente;

    public Pacientes() {
        super();

        //Instanciar objetos
        areaBotoes = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
        jbSalvar = new JButton("Salvar");
        jbAlterar = new JButton("Alterar");
        jbExcluir = new JButton("Excluir");
        jbPesquisar = new JButton("Pesquisar");
        jbAnamnese = new JButton("Anamnese");
        areaEdicao = new AreaEdicao();
        tableModelPaciente = new TableModelPaciente();
        jtPacientes = new JTable(tableModelPaciente);
        jspPacientes = new JScrollPane(jtPacientes);
        pacienteCrudXML = new PacienteCrudXML();
        pacienteEmEdicao = new Paciente();
        
        //definir propriedades visuais
        jtPacientes.setFillsViewportHeight(true);
        jtPacientes.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jtPacientes.getColumnModel().getColumn(0).setPreferredWidth(5);
        jtPacientes.getColumnModel().getColumn(1).setPreferredWidth(150);
        
        //definir layouts
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        areaBotoes.setLayout(new GridLayout(1, 7, 10, 5));

        //definir listeners
        jbSalvar.addActionListener(new TratarBotoesMenu());
        jbAlterar.addActionListener(new TratarBotoesMenu());
        jbExcluir.addActionListener(new TratarBotoesMenu());
        jbPesquisar.addActionListener(new TratarBotoesMenu());
        jbAnamnese.addActionListener(new TratarBotoesMenu());
                
        //adicionar objetos a conteineres
        areaBotoes.add(new JPanel());
        areaBotoes.add(jbSalvar);
        areaBotoes.add(jbAlterar);
        areaBotoes.add(jbExcluir);
        areaBotoes.add(jbPesquisar);
        areaBotoes.add(jbAnamnese);
        areaBotoes.add(new JPanel());add(areaEdicao);
        
        add(util.ElementoVazio.gerar(0, 5));
        add(areaBotoes);
        add(util.ElementoVazio.gerar(0, 5));
        add(jspPacientes);
        
        //setar propriedades da tela e mostra-la
        setVisible(true);
    }

    private void exibirPacienteEmEdicao() {
        if (this.pacienteEmEdicao == null){
            JOptionPane.showMessageDialog(this, "Nenhum paciente selecionado.", "Erro", JOptionPane.INFORMATION_MESSAGE);
        }else{
            carregarDadosPacienteAreaEdicao(this.pacienteEmEdicao);
        }
    }

    private void carregarDadosPacienteAreaEdicao(Paciente paciente) {
        areaEdicao.jtfNome.setText(paciente.getNome_paciente());
        areaEdicao.jtfEmail.setText(paciente.getEmail());
        areaEdicao.jtfObservacao.setText("");
        areaEdicao.jtfEndereco.setText(paciente.getEndereco());
        areaEdicao.jtfCidade.setText(paciente.getCidade());
        areaEdicao.jftfCPF.setText(paciente.getCpf_paciente().replace(" ", ""));
        areaEdicao.jftfTelefone.setText(paciente.getTelefone().replace(" ", ""));
        areaEdicao.jftfCelular.setText(paciente.getCelular().replace(" ", ""));
        areaEdicao.jftfDataNascimento.setText(paciente.getData_nascimento().replace(" ", ""));
//        areaEdicao.jcbConvenio.setSelectedItem(paciente.getConvenio());
        areaEdicao.jcbEstado.setSelectedItem(paciente.getUf());
    }

    private void atualizarTabela() {
        tableModelPaciente.atualizarDados();
        jtPacientes.getColumnModel().getColumn(0).setPreferredWidth(5);
        jtPacientes.getColumnModel().getColumn(1).setPreferredWidth(150);
    }

    private void limparCamposAreaEdicao() {
        areaEdicao.jtfNome.setText("");
        areaEdicao.jtfEmail.setText("");
        areaEdicao.jtfObservacao.setText("");
        areaEdicao.jtfEndereco.setText("");
        areaEdicao.jtfCidade.setText("");
        areaEdicao.jftfCPF.setText("");
        areaEdicao.jftfTelefone.setText("");
        areaEdicao.jftfCelular.setText("");
        areaEdicao.jftfDataNascimento.setText("");
        areaEdicao.jcbConvenio.setSelectedIndex(0);
        areaEdicao.jcbEstado.setSelectedIndex(0);
    }

    private void obterDadosPacienteAreaEdicao(Paciente paciente) {
            paciente.setNome_paciente(areaEdicao.jtfNome.getText());
            paciente.setEmail(areaEdicao.jtfEmail.getText());
            paciente.setEndereco(areaEdicao.jtfEndereco.getText());
            paciente.setCidade(areaEdicao.jtfCidade.getText());
            paciente.setCpf_paciente(areaEdicao.jftfCPF.getText());
            paciente.setTelefone(areaEdicao.jftfTelefone.getText());
            paciente.setCelular(areaEdicao.jftfCelular.getText());
            paciente.setData_nascimento(areaEdicao.jftfDataNascimento.getText());
            paciente.setConvenio(areaEdicao.jcbConvenio.getSelectedItem().toString());
            paciente.setUf(areaEdicao.jcbEstado.getSelectedItem().toString());
    }

    private class AreaEdicao extends JPanel {

        private JTextField jtfNome, jtfEmail, jtfObservacao, jtfEndereco, jtfCidade;
        private JFormattedTextField jftfCPF, jftfTelefone, jftfCelular, jftfDataNascimento;
        private JComboBox jcbConvenio, jcbEstado;
        private JPanel j1, j2, j3, j4, j5;
        private JLabel jlConvenio, jlEstado;
        private final String[] convenios = {"PA - Particular", "PS - Plano de saúde", "SUS - Sistema único de saúde"};
        private final String[] estados = {"AC", "AL", "AP","AM","BA", "CE", "DF", "ES","GO", "MA", "MT", "MS",
                                          "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC",
                                          "SP", "SE","TO"};

        public AreaEdicao() {
            super();
            
            //Instanciar objetos
            j1 = new JPanel(new GridLayout(1, 4, 5, 1));
            j2 = new JPanel(new GridLayout(1, 3, 5, 1));
            j3 = new JPanel(new GridLayout(1, 3, 5, 1));
            j4 = new JPanel(new BorderLayout(5, 0));
            j5 = new JPanel(new BorderLayout(5, 0));
            jtfNome = new JTextField();
            jtfEmail = new JTextField();
            jtfObservacao = new JTextField();
            jtfEndereco = new JTextField();
            jtfCidade = new JTextField();
            jftfCPF = new JFormattedTextField();
            jftfTelefone = new JFormattedTextField();
            jftfCelular = new JFormattedTextField();
            jftfDataNascimento = new JFormattedTextField();
            jcbConvenio = new JComboBox(convenios);
            jcbEstado = new JComboBox(estados);
            jlConvenio = new JLabel("Convênio:", SwingConstants.RIGHT);
            jlEstado = new JLabel("Estado:", SwingConstants.RIGHT);

            formatarCampos();
            
            //definir propriedades visuais
            jtfNome.setBorder(javax.swing.BorderFactory.createTitledBorder("Nome"));
            jtfEmail.setBorder(javax.swing.BorderFactory.createTitledBorder("E-mail"));
            jtfObservacao.setBorder(javax.swing.BorderFactory.createTitledBorder("Observações"));
            jtfEndereco.setBorder(javax.swing.BorderFactory.createTitledBorder("Endereço"));
            jtfCidade.setBorder(javax.swing.BorderFactory.createTitledBorder("Cidade"));
            jftfCPF.setBorder(javax.swing.BorderFactory.createTitledBorder("CPF"));
            jftfTelefone.setBorder(javax.swing.BorderFactory.createTitledBorder("Telefone"));
            jftfCelular.setBorder(javax.swing.BorderFactory.createTitledBorder("Celular"));
            jftfDataNascimento.setBorder(javax.swing.BorderFactory.createTitledBorder("Data de nascimento"));

            //definir layouts
            setLayout(new GridLayout(4, 1, 5, 10));

            //definir listeners
            
            //adicionar objetos a conteineres
            j4.add(jlConvenio, BorderLayout.WEST);
            j4.add(jcbConvenio, BorderLayout.CENTER);
            j5.add(jlEstado, BorderLayout.WEST);
            j5.add(jcbEstado, BorderLayout.CENTER);
            j1.add(jftfCPF);
            j1.add(jftfTelefone);
            j1.add(jftfCelular);
            j1.add(jtfEmail);
            j2.add(jftfDataNascimento);
            j2.add(j4);
            j2.add(jtfObservacao);
            j3.add(jtfEndereco);
            j3.add(jtfCidade);
            j3.add(j5);
            add(jtfNome);
            add(j1);
            add(j2);
            add(j3);
            
            //setar propriedades da tela e mostra-la
            setVisible(true);
        }

        private void formatarCampos() {
            try {
                Mascaras.maskCPF(jftfCPF);
                Mascaras.maskTelefone(jftfTelefone);
                Mascaras.maskTelefone(jftfCelular);
                Mascaras.maskData(jftfDataNascimento);
            } catch (ParseException ex) {
                ex.printStackTrace();
            }
        }
    }
    
    private class TratarBotoesMenu implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == jbSalvar){
                salvarPaciente();
            } else if (e.getSource() == jbAlterar){
                alterarPaciente();
            } else if(e.getSource() == jbExcluir) {
                excluirPaciente();
            } else if(e.getSource() == jbPesquisar) {
                pesquisarPaciente();
            } else if(e.getSource() == jbAnamnese) {
                anamnesePaciente();
            }
        }        
    }
    
    private void salvarPaciente() {
        if((pacienteEmEdicao == null) || (pacienteEmEdicao.getId_paciente() == null)){
            pacienteEmEdicao = new Paciente();
            obterDadosPacienteAreaEdicao(pacienteEmEdicao);
            pacienteCrudXML.salvar(pacienteEmEdicao);
            pacienteEmEdicao = new Paciente();
        }else{
            obterDadosPacienteAreaEdicao(pacienteEmEdicao);
            pacienteCrudXML.atualizar(pacienteEmEdicao);
            pacienteEmEdicao = new Paciente();
        }
        
        atualizarTabela();
        limparCamposAreaEdicao();
    }
    
    private void alterarPaciente() {
        pacienteEmEdicao = new Paciente();
        int selectedRow = jtPacientes.getSelectedRow();
        if(selectedRow == -1){
            JOptionPane.showMessageDialog(this, "Nenhum paciente selecionado.", "Saúde & Cia.", JOptionPane.INFORMATION_MESSAGE);
        }else{
            pacienteEmEdicao = tableModelPaciente.getRow(selectedRow);
            exibirPacienteEmEdicao();
        }
    }
    
    private void excluirPaciente() {
        pacienteEmEdicao = new Paciente();
        int selectedRow = jtPacientes.getSelectedRow();
        if(selectedRow == -1){
            JOptionPane.showMessageDialog(this, "Nenhum paciente selecionado.", "Saúde & Cia.",
                    JOptionPane.INFORMATION_MESSAGE);
        }else{
            pacienteEmEdicao = tableModelPaciente.getRow(selectedRow);
            if(JOptionPane.showConfirmDialog(this, "Deseja realmente excluir o paciente \"" + 
                    pacienteEmEdicao.getNome_paciente() + "\" ?", "Confirmação", JOptionPane.YES_NO_OPTION, 
                    JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
                pacienteCrudXML.excluir(pacienteEmEdicao);
                atualizarTabela();
            }
        }
    }
    
    private void pesquisarPaciente() {
        pacienteEmEdicao = new Paciente();
        pacienteEmEdicao = pacienteCrudXML.buscarPaciente(Integer.parseInt(JOptionPane.showInputDialog(this, "Informe o ID do paciente que desejar pesquisar:")));
        if(pacienteEmEdicao == null){
            JOptionPane.showMessageDialog(this, "Não foi encontrado nenhum paciente com o ID informado.", "Saúde & Cia.",
                    JOptionPane.INFORMATION_MESSAGE);
        }else{
            carregarDadosPacienteAreaEdicao(pacienteEmEdicao);
        }
        
    }
    
    private void anamnesePaciente() {
    }
}